/*
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.faces.context.FacesContext;
import model.AplOperador;
import org.primefaces.context.RequestContext;
import util.MyConexion;
import java.sql.SQLException;
import java.sql.Types;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author ebeltran
 */
public class AplOperadorDaoImpl implements AplOperadorDao {

    private static AplOperadorDaoImpl instancia = null;
    private Connection conn;

    private static AplOperadorDaoImpl getInstancia()
    {
        if(instancia == null)
            instancia = new AplOperadorDaoImpl();
        return instancia;
    }
    
    
    @Override
    public AplOperador findByUsuario(AplOperador aplOperador) {             
            RequestContext sesion = RequestContext.getCurrentInstance();
            String sql = "SELECT * FROM RS_APL_OPERADOR_LOGIN(?,?,?)";
            try {
                conn = MyConexion.getDBConexion().getConexion();
                try (PreparedStatement psmt = conn.prepareStatement(sql)) {
                    psmt.setInt(1, aplOperador.getId_agencia());
                    psmt.setString(2, aplOperador.getUsuario());
                    psmt.setString(3, aplOperador.getClave_e());
                    ResultSet rst;
                    for (rst = psmt.executeQuery(); rst.next();) {
                        aplOperador.setNombres(rst.getString("nombres"));                    /*  2 */
                        aplOperador.setApellidos(rst.getString("apellidos"));                /*  3 */
                        aplOperador.setFirma_mecanica(rst.getBlob("firma_mecanica"));        /*  4 */
                        aplOperador.setCorreo_email(rst.getString("correo_email"));          /*  5 */
                        aplOperador.setFec_ini_trabajo(rst.getTimestamp("fec_ini_trabajo")); /*  6 */
                        aplOperador.setFec_desde(rst.getTimestamp("fec_desde"));             /*  7 */
                        aplOperador.setFec_hasta(rst.getTimestamp("fec_Hasta"));             /*  8 */
                        aplOperador.setFec_ult_acceso(rst.getTimestamp("fec_ult_acceso"));   /*  9 */
                        aplOperador.setId_error(rst.getInt("id_error"));                     /* 10 */
                        aplOperador.setMensaje(rst.getString("mensaje"));                    /* 11 */
                    }
                    rst.close();
                }
                conn.close();
                return aplOperador;
            } catch (Exception e) {
                try {
                    conn.clearWarnings();
                    conn.close();
                } catch (SQLException e2) {
                }
            }
            return aplOperador;
        }
    
    @Override
    public AplOperador login(int id_agencia, String usuario, String clave_e) {
        {             
            RequestContext sesion = RequestContext.getCurrentInstance();
            String sql = "SELECT * FROM RS_APL_OPERADOR_LOGIN(?,?,?)";
            AplOperador apl = new AplOperador();
            try {
                conn = MyConexion.getDBConexion().getConexion();
                try (PreparedStatement psmt = conn.prepareStatement(sql)) {
                    psmt.setInt(1, id_agencia);
                    psmt.setString(2, usuario);
                    psmt.setString(3, clave_e);
                    ResultSet rst;
                    for (rst = psmt.executeQuery(); rst.next();) {
                        apl = new AplOperador();
                        apl.setNombres(rst.getString("nombres"));                    /*  2 */
                        apl.setApellidos(rst.getString("apellidos"));                /*  3 */
                        apl.setFirma_mecanica(rst.getBlob("firma_mecanica"));        /*  4 */
                        apl.setCorreo_email(rst.getString("correo_email"));          /*  5 */
                        apl.setFec_ini_trabajo(rst.getTimestamp("fec_ini_trabajo")); /*  6 */
                        apl.setFec_desde(rst.getTimestamp("fec_desde"));             /*  7 */
                        apl.setFec_hasta(rst.getTimestamp("fec_Hasta"));             /*  8 */
                        apl.setFec_ult_acceso(rst.getTimestamp("fec_ult_acceso"));   /*  9 */
                        apl.setId_error(rst.getInt("id_error"));                     /* 10 */
                        apl.setMensaje(rst.getString("mensaje"));                    /* 11 */
                    }
                    rst.close();
                }
                conn.close();
                return apl;
            } catch (Exception e) {
                try {
                    conn.clearWarnings();
                    conn.close();
                } catch (SQLException e2) {
                }
            }
            return apl;
        }
    }

    @Override
    public List<AplOperador> findAll() {
        List<AplOperador> lista = new ArrayList<>();
        ResultSet rst;
        String sql = "SELECT * FROM RS_APL_OPERADOR_TODOS(?,?)";
        RequestContext sesion = RequestContext.getCurrentInstance();
        int id_agencia = (int) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("id_agencia");
        String usuario_e = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
        try {

            conn = MyConexion.getDBConexion().getConexion();
            try (PreparedStatement psmt = conn.prepareStatement(sql)) {
                psmt.setInt(1, id_agencia);
                psmt.setString(2, usuario_e);
                rst = psmt.executeQuery();
                while (rst.next()) {
                    AplOperador aplOperador = new AplOperador();
                    aplOperador.setUsuario(rst.getString("usuario"));                      /*  0 */
                    aplOperador.setNombres(rst.getString("nombres"));                      /*  1 */
                    aplOperador.setApellidos(rst.getString("apellidos"));                  /*  2 */
                    aplOperador.setFirma_mecanica(rst.getBlob("firma_mecanica"));          /*  3 */
                    aplOperador.setCorreo_email(rst.getString("correo_email"));            /*  4 */
                    aplOperador.setFec_desde(rst.getTimestamp("fec_desde"));               /*  5 */
                    aplOperador.setFec_hasta(rst.getTimestamp("fec_hasta"));               /*  6 */
                    aplOperador.setFec_ult_acceso(rst.getTimestamp("fec_ult_acceso"));     /*  7 */
                    aplOperador.setFec_cambio_clave(rst.getTimestamp("fec_cambio_clave")); /*  8 */
                    aplOperador.setSi_es_activo(rst.getInt("si_es_activo"));               /*  9 */
                    
                    lista.add(aplOperador);
                }
                rst.close();
            }
            conn.close();
            return lista;
        } catch (Exception e) {
            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
            try {
                conn.clearWarnings();
                conn.close();
            } catch (SQLException e2) {
            }
        }
        return lista;
    }

    @Override
    public AplOperador reporteTodos() {
        RequestContext sesion = RequestContext.getCurrentInstance();
        String sql = "SELECT * FROM RJ_APL_OPERADOR(?,?,?)";
//        net.sf.jasperreports.engine.data.
                
//        JasperReport reportes = Jas
        return null;
    }

    @Override
    public boolean create(AplOperador aplOperador) {
        boolean flag = false;
        ResultSet rst = null;
        String sql = "{? = SELECT * FROM RA_APL_OPERADOR(?,?,?,?,?,?,?)}";

        RequestContext sesion = RequestContext.getCurrentInstance();
        int id_agencia = (int) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("id_agencia");
        String usuario_e = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

        String usuario = aplOperador.getUsuario();
        String nombres = aplOperador.getNombres();
        String apellidos = aplOperador.getApellidos();
        String correo_email = aplOperador.getCorreo_email();
        try {

            conn = MyConexion.getDBConexion().getConexion();
            try (PreparedStatement psmt = conn.prepareStatement(sql)) {
                psmt.setString(1, usuario_e);
                psmt.setInt(2, id_agencia);
                psmt.setString(3, usuario);
                psmt.setString(4, nombres);
                psmt.setString(5, apellidos);
                psmt.setString(6, correo_email);
                // Procedure execution
                for (rst = psmt.executeQuery(); rst.next();) {
                    
                }
                rst.next();
                
                flag = true;
                rst.close();
            }
            conn.close();
            return flag;
        } catch (Exception e) {
            e.printStackTrace();
            flag = false;
            try {
                conn.clearWarnings();
                conn.close();
            } catch (SQLException e2) {
                e2.printStackTrace();
            }
        }
        return flag;
    }

    @Override
    public boolean update(AplOperador aplOperador) {
        boolean flag;
        ResultSet rst;
        String sql = "SELECT * FROM RA_APL_OPERADOR(?,?,?,?,?,?,?,?)";
        RequestContext sesion = RequestContext.getCurrentInstance();
        int id_agencia = (int) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("id_agencia");
        String usuario_e = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
        
        try {

            conn = MyConexion.getDBConexion().getConexion();
            try (PreparedStatement psmt = conn.prepareStatement(sql)) {
                psmt.setInt(1, id_agencia);
                psmt.setString(2, usuario_e);
                psmt.setString(3, aplOperador.getUsuario());
                psmt.setString(4, aplOperador.getNombres());
                psmt.setString(5, aplOperador.getApellidos());
                psmt.setString(6, aplOperador.getClave_e());
                psmt.setBlob(7, aplOperador.getFirma_mecanica());
                psmt.setString(8, aplOperador.getCorreo_email());
                
                rst = psmt.executeQuery();
                rst.next();
                flag = true;
                
                rst.close();
            }
            conn.close();
            return flag;
        } catch (Exception e) {
            flag = false;
            try {
                conn.clearWarnings();
                conn.close();
            } catch (SQLException e2) {
            }
        }
        return flag;
    }

    @Override
    public boolean delete(String usuario) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}